#ifndef __GAF_OUTPUT_H__
#define __GAF_OUTPUT_H__

#include "GAF_Define.h"

#ifdef GAF_DEBUG

#pragma WARNING(disable:4003)

#define GAF_FILE			__FILE__
#define GAF_LINE			__LINE__
#define GAF_FUNCTION			__FUNCTION__
#define GAF_ENTER			"\n"
#define GAF_TAB				"\t"

#define GAF_OUTPUT			GAF::OutPut::GetInstance()

#define GAF_OUTTOSCREEN(_strFontFile)	GAF_OUTPUT.ToScreen(_strFontFile)
#define GAF_OUTTOFILE(_strFileName)	GAF_OUTPUT.ToFile(_strFileName)
#define GAF_CLOSEOUTFILE()		GAF_OUTPUT.CloseFile()
#define GAF_MARK()			GAF_OUTPUT.Out("", GAF::OUT_MARK, GAF_FILE, GAF_LINE, "")

#if defined(GAF_VC)
#define GAF_LOG(_str, ...)		GAF_OUTPUT.Out(_str, GAF::OUT_LOG, GAF_FILE, GAF_LINE, ##__VA_ARGS__)
#define GAF_WARM(_str, ...)		GAF_OUTPUT.Out(_str, GAF::OUT_WARM, "", 0, ##__VA_ARGS__)
#define GAF_NOTE(_str, ...)		GAF_OUTPUT.Out(_str, GAF::OUT_NOTE, "", 0, ##__VA_ARGS__)
#define GAF_ERROR(_str, ...)		GAF_OUTPUT.Out(_str, GAF::OUT_ERROR, GAF_FILE, GAF_LINE, ##__VA_ARGS__)
#elif defined(GAF_GCC)
#define GAF_LOG(_str, ...)		GAF_OUTPUT.Out(_str, GAF::OUT_LOG, GAF_FILE, GAF_LINE, ##__VA_ARGS__)
#define GAF_WARM(_str, ...)		GAF_OUTPUT.Out(_str, GAF::OUT_WARM, "", 0, ##__VA_ARGS__)
#define GAF_NOTE(_str, ...)		GAF_OUTPUT.Out(_str, GAF::OUT_NOTE, "", 0, ##__VA_ARGS__)
#define GAF_ERROR(_str, ...)		GAF_OUTPUT.Out(_str, GAF::OUT_ERROR, GAF_FILE, GAF_LINE, ##__VA_ARGS__)
#endif

#else /*GAF_DEBUG*/
#define GAF_OUTTOSCREEN(_strFontFile)
#define GAF_OUTTOFILE(_strFileName)
#define GAF_CLOSEOUTFILE()
#define GAF_MARK()
#define GAF_LOG(_str, ...)
#define GAF_WARM(_str, ...)
#define GAF_NOTE(_str, ...)
#define GAF_ERROR(_str, ...)
#endif /*GAF_DEBUG*/

#define GAF_ERRMARK()			GAF_ERROR("", "")

#ifdef GAF_DEBUG

namespace GAF
{
	/// 调试信息类型
	enum OutType
	{
		/// 标注，输出任意信息
		OUT_NOTE,
		/// 批注，输出信息，有换行，有位置
		OUT_LOG,
		/// 标记，只输出位置
		OUT_MARK, 
		/// 提示，输出信息，有换行，无位置
		OUT_WARM,
		/// 错误，输出错误信息，有换行，有位置
		OUT_ERROR,
		/// 致命地错误，
		OUT_FATAL
	};
}
typedef GAF::OutType			GAF_EOutType;
#define GAF_OUT_NOTE			GAF::OUT_NOTE
#define GAF_OUT_WARM			GAF::OUT_WARM
#define GAF_OUT_LOG			GAF::OUT_LOG
#define GAF_OUT_MARK			GAF::OUT_MARK
#define GAF_OUT_ERROR			GAF::OUT_ERROR

#define GAF_OUT_SCREENLINES			10

namespace GAF
{
	class _INTERFACE ScreenOut
	{
	public:
		virtual void		Out(STD_STRING strText, OutType otType) = 0;
	};

	/// 调试信息类
	class OutPut
	{
	public:
		static OutPut&		GetInstance();

	public:
		OutPut();
		~OutPut();

		/// 输出信息
		void			Out(STD_STRING strText, OutType otType, STD_STRING strFile, int nLine, ...);

		/// 输出到屏幕
		void			ToScreen(STD_STRING strTTFFontFile);

		/// 输出到文件
		void			ToFile(STD_STRING strFile);
		/// 关闭输出文件
		void			CloseFile();

	private:
		void			CreateMark(STD_STRING strFile, int nLine);

		/// 屏幕输出
		void			ScreenOut(STD_STRING strText, OutType otType);
		/// 控制台输出
		void			ConsoleOut(STD_STRING strText);
		/// 文件输出
		void			FileOut(STD_STRING strText);

	private: 
		STD_STRING		m_strOutText;

	private:
		bool			m_isScreen;

	private:
		bool			m_isFile;
		std::ofstream		m_ofOutFile;
	};
}
#endif /*GAF_DEBUG*/

#endif
